//
//  D_3ViewController.m
//  RACExamale
//
//  Created by cym_bj on 2017/12/1.
//  Copyright © 2017年 com.cym. All rights reserved.
//

#import "D_3ViewController.h"
#import <ReactiveObjC/ReactiveObjC.h>
@interface D_3ViewController ()

@end

@implementation D_3ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title=@"RACCommand";
    
    
    /*
     
     RACCommand :RAC中用于处理事件的类，可以把事件如何处理，事件中的数据如何传递，包装到这个类中，他可以很方便的监控事件的执行过程。
     使用场景：监听按钮点击，网络请求等等.
     
     // 1、创建命令
        2、执行命令。
     
     */
    
    
    //[self command1];
    //[self command2];

    
    
    
    
    
}

#pragma mark - 简单的命令操作
-(void)command1
{
    // 当命令内部发送数据完成，一定要主动发送完成
    
    RACCommand *command=[[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        
        
        //input ：执行命令传入参数
        //Block调用:执行命令的时候就会调用
        
        NSLog(@"input=%@",input);
        
        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            
            [subscriber sendNext:@"执行命令产生的数据"];
            
            //发送完成
            [subscriber sendCompleted];
            
            return nil;
        }];
        
    }];
    
    //监听事件有没有完成
    [command.executing subscribeNext:^(NSNumber * _Nullable x) {
        
        
        //当前正在执行
        if ([x boolValue]==YES) {
            
            NSLog(@"当前正在执行");
        }
        //执行完成/没有执行
        else{
            NSLog(@"执行完成/没有执行");
        }
        
    }];
    
    //执行命令
    [command execute:@"执行了"];
}
#pragma mark - 获取命令中信号发送的数据
-(void)command2
{
    // RACCommand ：不能返回一个空的信号
    
    RACCommand *command=[[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
       
        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
           
            [subscriber sendNext:@"发送数据"];
            //发送完成
            [subscriber sendCompleted];
            
            return nil;
        }];
        
    }];
    
    [command.executing subscribeNext:^(NSNumber * _Nullable x) {
       
        if ([x boolValue]==YES) {
            
            NSLog(@"正在执行");
        }
        else
        {
         
            NSLog(@"没有执行/执行完成");
        }
            
    }];
    
    RACSignal *sinal=[command execute:@"执行命令"];
    
    //订阅信号，获取 执行命令中信号的数据
    [sinal subscribeNext:^(id  _Nullable x) {
        
        NSLog(@"执行命令中信号的数据:%@",x);
    }];
    
    
    
    
}

@end
